#include <iostream>
#include <unistd.h>
#include <string.h>

using namespace std;

class String{
	private:
		char* _str;
	public:
	//	String(const char* str = "")
	//		: _str(new char[strlen(str) + 1])
	//	{
	//		strcpy(_str, str);
	//	}
		String(const char* str = "")
		{
			if(NULL == str)
				str = "";
			_str = new char[strlen(str) + 1];
			strcpy(_str, str);
		}

		String(const String& s)
			: _str(NULL)
		{
			String temp(s._str);
			swap(_str, temp._str);
		}

		void Swap(String s)
		{
			swap(_str, s._str);
		}

		String& operator=(const String& s)
		{
			if(this != &s)
			{
				String temp(s);
				swap(_str, temp._str);
			}
			return *this;
		}

		~String()
		{
			if(_str)
			{
				delete[] _str;
				_str = NULL;
			}
		}

		friend ostream& operator<<(ostream& _cout, const String& s);
};

ostream& operator<<(ostream& _cout, const String& s)
{
	_cout << s._str;
	return _cout;
}

void TestString()
{
	String s1("HELLO");
	cout << s1 << endl;
	String s2(s1);
	cout << s2 << endl;
	s2 = s1;
	cout << s2 << endl;
}

int main()
{
	TestString();
	return 0;
}
